let base = Module.getBaseAddress('MTPotal');
console.log(`base: ${base}`)

let targetFunc = ObjC.classes['MPCryptoService']['- generateRandom:'].implementation;
Interceptor.attach(ObjC.classes['MPSignatureService']['- signBySignKey:autoCode:content:'].implementation, {
    onEnter(args){
        console.log(new ObjC.Object(args[2]))
        console.log(args[3])
        console.log(new ObjC.Object(args[4]))
    }
})

// let code = Instruction.parse(targetFunc);
// console.log('code', code);

// Interceptor.attach(
//     targetFunc,
//     {
//         onEnter(args) {
//             // console.log(`-[NSConcreteMutableData appendBytes:${args[2]} length:${args[3].toInt32()}]`);
//             // console.log(hexdump(args[2], {length: args[3].toInt32()}))
//             // code = Instruction.parse(targetFunc);
//             // console.log('after code', code);

//         },
//         onLeave(ret){
//             let a = new ObjC.Object(ret);
//             console.log('generateRandom', a)
//             let nsstr = ObjC.classes.NSString;
//             let ocstr = nsstr.stringWithFormat_('1111111111111111');
//             ret.replace(ocstr);
//             console.log('generateRandom2', new ObjC.Object(ret))

//         }

//     }
// )

// if (base.add(0x2BB24B8)) {
//     Interceptor.replace(base.add(0x2BB24B8), new NativeCallback(function (arg1) {
//         console.log('Replaced target_function with custom logic');
//     }, 'void', ['void']));
// } else {
//     console.error('target_function not found!');
// }
// if (base.add(0x2BB7C4C)) {
//     Interceptor.replace(base.add(0x2BB7C4C), new NativeCallback(function (arg1) {
//         console.log('Replaced target_function with custom logic');
//     }, 'void', ['void']));
// } else {
//     console.error('target_function not found!');
// }
// console.log(`Current Process PID: ${Process.id}`);

// Interceptor.attach(
//     base.add(0x02BC3DC4),
//     {
//         onEnter(args) {
//             console.log('sub_2BB7B98', args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
            
//         }
//     }
// )
// try {
//     var p_pthread_create = Module.findExportByName(null, "pthread_create");
//     var pthread_create = new NativeFunction(p_pthread_create, "int", ["pointer", "pointer", "pointer", "pointer"]);
//     Interceptor.replace(p_pthread_create, new NativeCallback(function(ptr0, ptr1, ptr2, ptr3) {
//         if (ptr1.isNull() && ptr3.isNull()) {
//             console.log("Possible thread creation for checking. Disabling it");
//             return -1;
//         } else {
//             return pthread_create(ptr0, ptr1, ptr2, ptr3);
//         }
//     }, "int", ["pointer", "pointer", "pointer", "pointer"]));
// } catch (error) {
//     console.log("Error", error)
// }

// Interceptor.attach(
//     // ObjC.classes['SafeSignatureModule']['- signInternal:appkey:key:message:needHex:'].implementation,
//     // ObjC.classes['MWingCommander']['- init'].implementation,
//     base.add(0x2bb26c0),
//     {
//         onEnter(args) {
//             this.a1 = args[2]
//             this.a2 = args[3]
//             this.a3 = args[4]
//             this.a4 = args[5]

//             console.log('initialize:privateInitialize:withCustomBundlePath::',this.a1, this.a2, this.a3)
//             console.log(hexdump(this.a1))
//             console.log(hexdump(this.a2))

//             // console.log(new ObjC.Object(this.a3))
//             // let a4 = new ObjC.Object(this.a4)
//             // console.log(hexdump(a4.bytes(), { length: a4.length() }))

//             // console.log('a5', args[6])
//             var tid = Process.getCurrentThreadId();
//             this.tid = tid;
//                     console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         .map(DebugSymbol.fromAddress).join('\n') + '\n')
//             Stalker.follow(tid, {
//                 events: {
//                     call: true, // CALL instructions: yes please
//                     ret: false, // RET instructions
//                     exec: false, // all instructions: not recommended as it's
//                     block: false, // block executed: coarse execution trace
//                     compile: false // block compiled: useful for coverage
//                 },
//                 transform: (iterator) => {
//                     let instruction = iterator.next();
//                     const startAddress = instruction.address;
//                     var isAppCode = startAddress.compare(base.add(0x2bb26c0)) >= 0 
//                     && startAddress.compare(base.add(0x2bb26c0).add(10000)) === -1;
//                     do {
//                         if (isAppCode) {
//                             console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//                             if (instruction.address.sub(base).equals(0x2bc3634) ) {
//                                 // console.log('regsRead',instruction.x9, instruction.x11)
//                                 iterator.putCallout((ctx, data) => {
//                                     console.log('0x00F0CC50 x2', 
//                                         ctx.x8
//                                         // ctx.x10.sub(base).add(0x100000000)
//                                     // A0 00 1F D6 2D 01 00 00
//                                     );

//                                 });
//                             }
//                         }
//                         iterator.keep();
//                     } while ((instruction = iterator.next()) !== null);

//                 }
//             })

//         },
//         onLeave(ret) {
//             // let a = new ObjC.Object(ret);
//             console.log('generateRandom', ret)
//             Stalker.unfollow(this.tid);
//             Stalker.garbageCollect();
//             // let nsstr = ObjC.classes.NSString;
//             // let ocstr = nsstr.stringWithFormat_('1111111111111111');
//             // ret.replace(ocstr);
//             // console.log('generateRandom2', new ObjC.Object(ret))

//         }

//     }
// )


// Interceptor.attach(base.add(0xF83170), {
//     onEnter(args) {
//         this.a2 = args[1];
//         console.log('sub_F83170', args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7])
//     },
//     onLeave(ret) {
//         let a4 = new ObjC.Object(ret)
//         if (this.a2.equals(0x5)) {
//             console.log('ret', hexdump(a4.bytes(), { length: a4.length() }))
//         } else {

//             console.log('sub_F83170', new ObjC.Object(ret))
//         }
//     }
// })

// Interceptor.attach(base.add(0xF7DEE0), {
//     onEnter(args) {
//         this.a2 = args[1];
//         console.log('sub_F6FEBC', args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7])
//         console.log('sub_F6FEBC 0', hexdump(args[0]));
//         // console.log('sub_F6FEBC 2', hexdump(args[2]));
//         // console.log('sub_F6FEBC 3', hexdump(args[3]));
//         this.tid = Process.getCurrentThreadId();
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//         // Stalker.follow(this.tid, {
//         //                     events: {
//         //                         call: true, // CALL instructions: yes please
//         //                         ret: false, // RET instructions
//         //                         exec: false, // all instructions: not recommended as it's
//         //                         block: false, // block executed: coarse execution trace
//         //                         compile: false // block compiled: useful for coverage
//         //                     },
//         //                     transform: (iterator) => {
//         //                         let instruction = iterator.next();
//         //                         const startAddress = instruction.address;
//         //                         var isAppCode = startAddress.compare(base.add(0xF6FEBC )) >= 0 && startAddress.compare(base.add(0xF6FEBC).add(10000)) === -1;
//         //                         do {
//         //                             if (isAppCode) {
//         //                                 console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//         //                                 // if (instruction.address.sub(base).equals(0x11b18fc) ) {
//         //                                 //     // console.log('regsRead',instruction.x9, instruction.x11)
//         //                                 //     iterator.putCallout((ctx, data) => {
//         //                                 //         console.log('0x00F0CC50 x2', hexdump(ctx.x2));
            
//         //                                 //     });
//         //                                 // }
//         //                             }
//         //                             iterator.keep();
//         //                         } while ((instruction = iterator.next()) !== null);
            
//         //                     }
//         //                 })
        
//     },
//     onLeave(ret) {
//         console.log('sub_F6FEBC', ret)
//         Stalker.unfollow(this.tid);
//         Stalker.garbageCollect();
//     }
// })
// var pattern = '8e d5 5b 5b';// the pattern that you are interested in
// pattern = 'b0 fb 0e 4e';// the pattern that you are interested in
// // pattern = pattern.split(' ').reverse().join(' ');// reverse the pattern

// var m = Process.enumerateModules()[0];// enumerate loaded modules and take the first one


// Memory.scan(m.base, m.size, pattern, {
//     onMatch: function (address, size) {// called when pattern matches
//         console.log("Memory.scan() found at " + address.sub(base).add(0x100000000) + " with size " + size);
//         return 'stop';// optional, stop scanning early
//     },

//     onComplete: function () {
//         console.log("Memory.scan() complete");
//     }
// });

// Interceptor.attach(base.add(0xF7E4A4), {
//     onEnter(args) {
//         this.a2 = args[1];
//         console.log('sub_F7E4A4', args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7])
//         console.log('sub_F7E4A4 0', hexdump(args[0], {
//             length: args[1].toInt32()
//         }));

//     }
// })

// // Interceptor.attach(ObjC.classes['DTRpcOperation']['- trustedSignRequest:'].implementation, {
// //     onEnter(args) {
// //         console.log('DTRpcOperation.trustedSignRequest', new ObjC.Object(args[2]));
        
// //     }
// // }
// // )




// // Hook exit 和 abort 函数的 Frida 脚本
// const exitFunction = Module.findExportByName(null, 'exit');
// const abortFunction = Module.findExportByName(null, 'abort');

// if (exitFunction) {
//     console.log('exit function found at:', exitFunction);

//     Interceptor.attach(exitFunction, {
//         onEnter: function (args) {
//             // 打印退出状态
//             const status = args[0].toInt32();
//             console.log('exit called with status:', status);

//             // 打印调用栈（可选）
//             console.log('Backtrace:');
//             console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//                 .map(DebugSymbol.fromAddress).join('\n') + '\n');
//         }
//     });
// } else {
//     console.error('exit function not found!');
// }

// if (abortFunction) {
//     console.log('abort function found at:', abortFunction);

//     Interceptor.attach(abortFunction, {
//         onEnter: function (args) {
//             // 打印 abort 调用
//             console.log('abort called');

//             // 打印调用栈（可选）
//             console.log('Backtrace:');
//             console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//                 .map(DebugSymbol.fromAddress).join('\n') + '\n');
//         }
//     });
// } else {
//     console.error('abort function not found!');
// }